Skip to content

feat(profile-metrics-controller): add batched proof-of-ownership signing - #10142

Open
hmalik88 wants to merge 7 commits into
mainfrom
hm/mul-2185
Open

feat(profile-metrics-controller): add batched proof-of-ownership signing#10142
hmalik88 wants to merge 7 commits into
mainfrom
hm/mul-2185

Conversation

@hmalik88

@hmalik88 hmalik88 commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Explanation

This PR adds batched proof-of-ownership signing to @metamask/profile-metrics-controller. Previously, ProfileMetricsController requested one proof signature per queued account by calling ProofOfOwnershipService:sign for each account. For snap-backed non-EVM accounts, that meant one SnapController:handleRequest call per account, causing large proof-signing fan-out during profile metrics sync.

This PR adds ProofOfOwnershipService:signBatch and updates ProfileMetricsController to call it once per entropy-source batch. The service keeps EVM behavior unchanged by signing each EVM account through KeyringController:signPersonalMessage, but groups snap-backed non-EVM accounts by snapId and sends one signProofOfOwnershipBatch request per snap.

Batch responses preserve input order. Per-item snap errors are handled per account, so successful proofs in the same batch are still submitted. Whole snap batch failures or malformed responses are allowed to throw, so the sync queue is not cleared on a broken batch integration.

References

Requires wallet snaps to support signProofOfOwnershipBatch:

Breaking Change

ProfileMetricsController now calls ProofOfOwnershipService:signBatch when attaching ownership proofs during profile metrics sync.

Consumers must update their controller messenger wiring to delegate ProofOfOwnershipService:signBatch to ProfileMetricsController. Clients must also ensure the involved wallet snaps support the signProofOfOwnershipBatch JSON-RPC method before adopting this core version, because this change does not fall back to singleton signProofOfOwnership calls.

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

High Risk
Breaking integration with messenger wiring and wallet snaps, plus changed sync-queue behavior when batch signing fails entirely (batch retained instead of proof-less submit).

Overview
Adds batch proof-of-ownership signing for profile metrics sync so mnemonic batches no longer fan out one snap/keyring call per account.

ProofOfOwnershipService:signBatch is new: EVM items still sign via KeyringController:signPersonalMessage (one call per account), while snap-backed accounts are grouped by snapId and sent a single signProofOfOwnershipBatch JSON-RPC request per snap. Responses stay in input order, with per-item { proof } or { error } results.

ProfileMetricsController now calls signBatch once per entropy-source batch in #attachProofs instead of looping ProofOfOwnershipService:sign. Partial batch success still submits (accounts without proofs when an item errors); rejections or a mismatched result count throw, so the sync batch is not cleared and metrics are not submitted for that queue key.

This is a breaking change: messengers must delegate ProofOfOwnershipService:signBatch, and wallet snaps must implement signProofOfOwnershipBatch (no fallback to single-account signProofOfOwnership).

Reviewed by Cursor Bugbot for commit 2e870ce. Bugbot is set up for automated code reviews on this repo. Configure here.

@hmalik88
hmalik88 marked this pull request as ready for review September 8, 2026 12:35
@hmalik88
hmalik88 requested review from a team as code owners September 8, 2026 12:35
@hmalik88

hmalik88 commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@9.0.0-preview-cb8f74370
@metamask-previews/accounts-controller@39.1.1-preview-cb8f74370
@metamask-previews/address-book-controller@7.1.2-preview-cb8f74370
@metamask-previews/ai-controllers@1.0.0-preview-cb8f74370
@metamask-previews/analytics-controller@2.1.0-preview-cb8f74370
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-cb8f74370
@metamask-previews/announcement-controller@8.1.0-preview-cb8f74370
@metamask-previews/app-metadata-controller@2.0.1-preview-cb8f74370
@metamask-previews/approval-controller@9.0.2-preview-cb8f74370
@metamask-previews/assets-controller@15.1.0-preview-cb8f74370
@metamask-previews/assets-controllers@111.2.0-preview-cb8f74370
@metamask-previews/authenticated-user-storage@3.0.2-preview-cb8f74370
@metamask-previews/base-controller@9.1.0-preview-cb8f74370
@metamask-previews/base-data-service@1.0.0-preview-cb8f74370
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-cb8f74370
@metamask-previews/bridge-controller@80.2.1-preview-cb8f74370
@metamask-previews/bridge-status-controller@75.5.1-preview-cb8f74370
@metamask-previews/build-utils@3.0.4-preview-cb8f74370
@metamask-previews/chain-agnostic-permission@1.7.0-preview-cb8f74370
@metamask-previews/chomp-api-service@4.0.2-preview-cb8f74370
@metamask-previews/claims-controller@0.6.2-preview-cb8f74370
@metamask-previews/client-controller@1.0.1-preview-cb8f74370
@metamask-previews/client-utils@2.1.1-preview-cb8f74370
@metamask-previews/compliance-controller@2.1.0-preview-cb8f74370
@metamask-previews/composable-controller@12.0.1-preview-cb8f74370
@metamask-previews/config-registry-controller@3.1.0-preview-cb8f74370
@metamask-previews/connectivity-controller@0.3.0-preview-cb8f74370
@metamask-previews/controller-utils@12.3.0-preview-cb8f74370
@metamask-previews/core-backend@9.1.1-preview-cb8f74370
@metamask-previews/cryptography@0.0.0-preview-cb8f74370
@metamask-previews/delegation-controller@3.0.2-preview-cb8f74370
@metamask-previews/earn-controller@12.2.7-preview-cb8f74370
@metamask-previews/eip-5792-middleware@3.0.5-preview-cb8f74370
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-cb8f74370
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-cb8f74370
@metamask-previews/eth-block-tracker@15.0.1-preview-cb8f74370
@metamask-previews/eth-json-rpc-middleware@24.0.2-preview-cb8f74370
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-cb8f74370
@metamask-previews/foundryup@1.0.1-preview-cb8f74370
@metamask-previews/gas-fee-controller@26.3.2-preview-cb8f74370
@metamask-previews/gator-permissions-controller@5.0.2-preview-cb8f74370
@metamask-previews/geolocation-controller@1.0.0-preview-cb8f74370
@metamask-previews/java-tron-up@1.0.0-preview-cb8f74370
@metamask-previews/json-rpc-engine@10.5.0-preview-cb8f74370
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-cb8f74370
@metamask-previews/keyring-controller@27.1.1-preview-cb8f74370
@metamask-previews/kyc-controller@0.0.0-preview-cb8f74370
@metamask-previews/local-node-utils@1.0.0-preview-cb8f74370
@metamask-previews/logging-controller@9.0.0-preview-cb8f74370
@metamask-previews/message-manager@14.1.2-preview-cb8f74370
@metamask-previews/messenger@2.0.0-preview-cb8f74370
@metamask-previews/messenger-cli@0.2.0-preview-cb8f74370
@metamask-previews/money-account-api-data-service@0.4.1-preview-cb8f74370
@metamask-previews/money-account-balance-service@2.4.3-preview-cb8f74370
@metamask-previews/money-account-controller@1.0.0-preview-cb8f74370
@metamask-previews/money-account-upgrade-controller@4.0.0-preview-cb8f74370
@metamask-previews/money-account-utils@1.2.0-preview-cb8f74370
@metamask-previews/multichain-account-service@13.0.2-preview-cb8f74370
@metamask-previews/multichain-api-middleware@4.0.3-preview-cb8f74370
@metamask-previews/multichain-network-controller@3.2.4-preview-cb8f74370
@metamask-previews/multichain-transactions-controller@7.1.2-preview-cb8f74370
@metamask-previews/name-controller@9.1.2-preview-cb8f74370
@metamask-previews/network-connection-banner-controller@0.2.1-preview-cb8f74370
@metamask-previews/network-controller@36.0.0-preview-cb8f74370
@metamask-previews/network-enablement-controller@6.0.5-preview-cb8f74370
@metamask-previews/notification-services-controller@27.0.2-preview-cb8f74370
@metamask-previews/passkey-controller@3.1.0-preview-cb8f74370
@metamask-previews/permission-controller@13.1.1-preview-cb8f74370
@metamask-previews/permission-log-controller@5.1.0-preview-cb8f74370
@metamask-previews/perps-controller@16.1.0-preview-cb8f74370
@metamask-previews/phishing-controller@17.4.1-preview-cb8f74370
@metamask-previews/platform-api-docs@0.1.0-preview-cb8f74370
@metamask-previews/polling-controller@16.0.9-preview-cb8f74370
@metamask-previews/preferences-controller@23.1.0-preview-cb8f74370
@metamask-previews/profile-metrics-controller@4.0.4-preview-cb8f74370
@metamask-previews/profile-sync-controller@30.0.0-preview-cb8f74370
@metamask-previews/ramps-controller@20.3.0-preview-cb8f74370
@metamask-previews/rate-limit-controller@7.0.1-preview-cb8f74370
@metamask-previews/react-data-query@1.0.0-preview-cb8f74370
@metamask-previews/remote-feature-flag-controller@6.1.1-preview-cb8f74370
@metamask-previews/sample-controllers@5.0.6-preview-cb8f74370
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-cb8f74370
@metamask-previews/selected-network-controller@26.1.7-preview-cb8f74370
@metamask-previews/sentinel-api-service@1.0.1-preview-cb8f74370
@metamask-previews/shield-controller@6.0.2-preview-cb8f74370
@metamask-previews/signature-controller@39.2.10-preview-cb8f74370
@metamask-previews/smart-transactions-controller@26.0.1-preview-cb8f74370
@metamask-previews/snap-account-service@2.1.2-preview-cb8f74370
@metamask-previews/social-controllers@2.8.1-preview-cb8f74370
@metamask-previews/solana-test-validator-up@1.0.0-preview-cb8f74370
@metamask-previews/stellar-quickstart-up@0.0.0-preview-cb8f74370
@metamask-previews/storage-service@1.0.2-preview-cb8f74370
@metamask-previews/subscription-controller@8.1.0-preview-cb8f74370
@metamask-previews/transaction-controller@69.8.1-preview-cb8f74370
@metamask-previews/transaction-pay-controller@27.1.2-preview-cb8f74370
@metamask-previews/user-operation-controller@41.2.9-preview-cb8f74370
@metamask-previews/wallet@12.0.3-preview-cb8f74370
@metamask-previews/wallet-cli@0.0.0-preview-cb8f74370

@hmalik88
hmalik88 marked this pull request as draft September 8, 2026 13:11
@hmalik88
hmalik88 marked this pull request as ready for review September 10, 2026 15:44

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 936c3ce. Configure here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant